package br.com.controle.ejb;

import br.com.controle.entity.Medida;
import br.com.controle.entity.Produto;
import br.com.controle.mdb.Mensagem;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.Session;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
@LocalBean
public class ProdutoSessionBean {
    @Resource(mappedName = "jms/NotificationQueue")
    private Queue notificationQueue;
    @Resource(mappedName = "jms/NotificationQueueFactory")
    private ConnectionFactory notificationQueueFactory;

    @PersistenceContext
    private EntityManager em;    

    public List<Produto> retrieve() {
        Query query = em.createNamedQuery("Produto.findAll");
        return query.getResultList();
    }
        
    public List<Medida> getMedida(){
        Query query = em.createNamedQuery("Medida.findAll");
        return query.getResultList();
    }    
     
  public Produto create(Produto produto)
    {
        em.merge(produto); 
         
        Mensagem m = new Mensagem();
        try {
            m.sendJMSMessageToNotificationQueue(produto);
        } catch (JMSException ex) {
            Logger.getLogger(MedidaSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }    
 
        return produto;
    }    

    public Produto update(Produto produto)
    {           
        Produto updated = em.merge(produto); 
      
        Mensagem m = new Mensagem();
        try {
            m.sendJMSMessageToNotificationQueue(updated);
        } catch (JMSException ex) {
            Logger.getLogger(MedidaSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }        
        return updated;
    }
    
    public void delete(Produto produto) {
        Produto excluir = em.find(Produto.class, produto.getId());
        em.remove(excluir);
        
        Mensagem m = new Mensagem();
        try {
            m.sendJMSMessageToNotificationQueue(produto);
        } catch (JMSException ex) {
            Logger.getLogger(MedidaSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }      
    
    public Produto getProduto(Produto produto){
        Query query = em.createNamedQuery("Produto.findById").setParameter("id", produto.getId());
        return (Produto) query.getSingleResult();
    }        
}
